#============================================
# #知识点
# 1.什么是异常
# 异常是程序发生错误的信号。程序一旦出现错误，便会产生一个异常，
# 若程序中没有处理它，就会抛出该异常，程序的运行也随之终止。
# 2.异常处理的三个特征
# 异常的追踪信息
# 异常的类型
# 异常的内容
# 3、为何处理异常
# 为了增强程序的健壮性，即便是程序运行过程中出错了，也不要终止程序
# 而是捕捉异常并处理:将出错信息记录到日志内
#============================================
# # 而错误分成两种，一种是语法上的错误SyntaxError，这种错误应该在程序运行前就修改正确
# if  
#   File "<stdin>", line 1
# # SyntaxError: invalid syntax
#============================================
# # 另一类就是逻辑错误，常见的逻辑错误如
# # TypeError：数字类型无法与字符串类型相加
# 1+’2’
# # ValueError：当字符串包含有非数字的值时，无法转成int类型
# num=input(">>: ") #输入hello
# int(num)
# # NameError：引用了一个不存在的名字x
# x
# # IndexError：索引超出列表的限制
# l=['egon','aa']
# l[3]
# # KeyError：引用了一个不存在的key
# dic={'name':'egon'}
# dic['age']
# # AttributeError：引用的属性不存在
# class Foo:
#     pass
# Foo.x
# # ZeroDivisionError：除数不能为0
# 1/0
#============================================
# 异常处理主要是针对，无法预知的错误异常(能少用就少用)
# 一、、、、、
# try:
    # 被检测的代码块
    #子代码1
    #子代码2
    #.....
# except #异常类型1 as 异常信息：
    # 检测到异常，就执行这个位置的逻辑
# except #异常类型2 as 异常信息：
    # 检测到异常，就执行这个位置的逻辑
# except #异常类型3 as 异常信息：
    # 检测到异常，就执行这个位置的逻辑
#.....(可以跟多个异常)  
#else:
    #如果被检测子代码没有发生异常，就会执行else下面的代码
#finally:
    #无论子代码有没有发生异常，都会执行这块的代码
# 二、、、、、
# try:
#     被检测的代码块
# except (NameError,IndexError,TypeError):
#     触发NameError或IndexError或TypeError时对应的处理逻辑
# 三、、、、、
# try:
#     被检测的代码块
# except NameError:
#     触发NameError时对应的处理逻辑
# except IndexError:
#     触发IndexError时对应的处理逻辑
# except Exception:
#     其他类型的异常统一用此处的逻辑处理
#============================================
try:
    lis = [1,2,3,3]
    lis[10]
except Exception as e:
    print("索引错误")
else:
    print("子代码没有发生错误!")
finally:#应该把被检测代码回收资源的代码写在这里
    print("我最后还是运行了嘿嘿")
#============================================